package com.kun.video.ui.control;

import com.kun.video.ui.ComponentUtil;
import com.kun.video.ui.KunComponent;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.WeakChangeListener;
import javafx.css.PseudoClass;
import javafx.scene.AccessibleRole;
import javafx.scene.Parent;
import javafx.scene.control.TextField;

/**
 * 高性能、低资源占用的可扩展文本框基类（优化版）
 * <p>
 * 优化要点：
 * 1. 增强样式系统：支持动态主题切换和状态样式
 * 2. 改进输入校验：支持全文本校验和增量校验两种模式
 * 3. 添加性能开关：可关闭非必要功能提升性能
 * 4. 扩展事件体系：增加焦点变化和提交事件
 * 5. 优化内存管理：使用轻量级监听器注册机制
 * <p>
 * 扩展点说明：
 * - 样式扩展：覆盖initStyle()或通过addStyleClass()动态添加
 * - 事件处理：onFocusChanged()/onCommit()等新增回调
 * - 校验策略：通过setValidationMode()切换校验粒度
 * - 布局优化：override layoutChildren()实现复杂布局
 *
 * @author gzc
 */
public class KunTextField extends TextField implements KunComponent {
    private static final String STYLE_CLASS = "kun-text-field";
    /**
     * 性能配置参数
     */
    private boolean enableLiveValidation = true;
    private boolean enableAutoLayout = true;
    private ValidationMode validationMode = ValidationMode.FULL_TEXT;
    /**
     * 状态跟踪
     */
    private boolean wasFocused = false;

    public KunTextField() {
        super();
        initialize();
    }

    public KunTextField(String text) {
        super(text);
        initialize();
    }

    @Override
    public void initStyleClass() {
        KunComponent.super.initStyleClass();
        ComponentUtil.weakChangeListener(styleProperty(), (obs, old, newVal) -> onStyleChanged());
    }

    @Override
    public Parent getNode() {
        return this;
    }

    @Override
    public String getStyleName() {
        return STYLE_CLASS;
    }

    @Override
    public void initLayout() {

    }

    @Override
    public void initDimensions() {

    }

    @Override
    public void initListeners() {
        // 使用弱引用监听器注册
        ComponentUtil.weakChangeListener(focusedProperty(), (obs, old, now) -> handleFocusChange(now));
        ComponentUtil.weakChangeListener(textProperty(), (obs, old, now) -> handleTextUpdate(old, now));
    }

    @Override
    public void initData() {
        setAccessibleRole(AccessibleRole.TEXT_FIELD);
        setAccessibleText("输入框");
    }

    @Override
    public void reactiveDimensions(double width, double height) {

    }

    @Override
    public void dispose() {

    }

    /**
     * 通用弱引用监听器注册方法
     */
    protected <T> void addWeakListener(ObservableValue<T> property, ChangeListener<? super T> listener) {
        property.addListener(new WeakChangeListener<>(listener));
    }

    /**
     * 焦点变化处理（可重写）
     */
    protected void handleFocusChange(boolean hasFocus) {
        if (wasFocused && !hasFocus) {
            onCommit();
        }
        wasFocused = hasFocus;
        onFocusChanged(hasFocus);
    }

    /**
     * 文本更新处理流水线
     */
    private void handleTextUpdate(String oldVal, String newVal) {
        if (enableLiveValidation) {
            performValidation(newVal);
        }
        onTextChanged(oldVal, newVal);
        if (enableAutoLayout) {
            requestLayout();
        }
    }

    /**
     * 文本变化事件处理（可重写）
     *
     * @param oldValue 变更前文本
     * @param newValue 变更后文本
     */
    protected void onTextChanged(String oldValue, String newValue) {
        // 默认空实现，子类可扩展
    }


    /**
     * 执行校验逻辑
     */
    private void performValidation(String input) {
        boolean isValid = validationMode == ValidationMode.FULL_TEXT ?
                validateText(getText()) :
                validatePartialText(input);

        pseudoClassStateChanged(PseudoClass.getPseudoClass("invalid"), !isValid);
    }

    /**
     * 输入校验方法（可重写）
     *
     * @param input 待校验文本
     * @return 是否通过校验
     */
    protected boolean validateText(String input) {
        // 默认允许任何输入
        return true;
    }


    /**
     * 增强版文本替换逻辑
     */
    @Override
    public void replaceText(int start, int end, String text) {
        if (shouldAllowReplacement(start, end, text)) {
            super.replaceText(start, end, text);
        }
    }

    /**
     * 替换条件判断（可扩展）
     */
    protected boolean shouldAllowReplacement(int start, int end, String newText) {
        if (validationMode == ValidationMode.INCREMENTAL) {
            return validatePartialText(newText);
        }
        // FULL_TEXT模式在handleTextUpdate处理
        return true;
    }

    /**
     * 可重写校验方法（新增增量校验）
     */
    protected boolean validatePartialText(String newPart) {
        // 默认允许任何输入
        return true;
    }

    /**
     * 布局优化：添加缓存机制
     */
    @Override
    protected double computePrefWidth(double height) {
        // 带边距
        return enableAutoLayout ?
                super.computePrefWidth(height) + 24 :
                super.computePrefWidth(height);
    }

    /**
     * 扩展点：焦点变化回调
     */
    protected void onFocusChanged(boolean focused) { /* 子类实现 */ }

    /**
     * 扩展点：文本提交（失焦时触发）
     */
    protected void onCommit() { /* 子类实现 */ }

    /**
     * 扩展点：样式动态变化回调
     */
    protected void onStyleChanged() { /* 子类实现 */ }

    /**
     * 配置方法
     */
    public void setValidationMode(ValidationMode mode) {
        this.validationMode = mode;
    }

    public void enablePerformanceMode(boolean enable) {
        this.enableLiveValidation = !enable;
        this.enableAutoLayout = !enable;
    }

    /**
     * 校验模式枚举
     */
    public enum ValidationMode {
        /**
         * 全文本校验：验证最终完整文本
         * 增量校验：仅验证新增内容
         */
        FULL_TEXT, INCREMENTAL
    }

}